package com.hopu.service.MyHouse;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hopu.dto.MyHouseDto;
import com.hopu.entity.MyHouse;
import com.hopu.mapper.MyHouseMapper;
import com.hopu.util.HouseResult;
import com.hopu.util.StaticData;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * @Package: com.hopu.service
 * @ClassName: MyHouseServiceImple
 * @Author: xiaoBao
 * @CreateTime: 2020/11/4 5:20
 * @Description: 【房屋资料功能服务层实现类】
 */
@Service("myHouseServiceImple") /**定义服务层*/
public class MyHouseServiceImple implements MyHouseService{
    @Autowired /**引入MyHouseMapper动态接口（持久层）*/
    private MyHouseMapper myHouseMapper;


    /**
     * findAllHouseInfo 【查询所有房屋资料信息并分页显示】
     * @param current 当前页；
     * @return 将分页后的房屋资料信息返回给表现层。
     */
    @Override
    public HouseResult<PageInfo<MyHouseDto>> findAllHouseInfo(Integer current) {
            /**使用分页技术*/
            //1、使用startPage方法：参数1：配置 “分页的初始页”；参数2：“当前页要显示的信息行数”；
            PageHelper.startPage(current, StaticData.DEFAULT_PAGE_SIZE);

            //2、调用持久层操作：查询所有房屋资料信息，返回一个List集合；
            List<MyHouseDto> houseList = myHouseMapper.findAllHouseInfo();

            //3、实例化PageInfo对象，将房屋资料信息集合进行分页；
            PageInfo<MyHouseDto> housePageInfo = new PageInfo<>(houseList);

            //判断：如果集合的大小不为0
            if(houseList.size() != 0){
                //则将分页后的员工信息返回给表现层
                return new HouseResult<>(0,"房屋资料信息查询成功",housePageInfo);
            }else {
                return new HouseResult<>(1,"房屋资料信息查询失败",housePageInfo);
            }
    }


    /**
     * findHouseInfoById 【根据房屋Id查询一条房屋信息（查看房屋详细信息）】
     * @param myHouse 房屋Id；
     * @return 将查询到的房屋信息放回给表现层。
     */
    @Override
    public HouseResult<MyHouseDto> findHouseInfoById(MyHouse myHouse) {
        //调用持久层操作：根据Id查询一条具体房屋资料信息
        MyHouseDto houseInfo = myHouseMapper.findHouseInfoById(myHouse);
        if(houseInfo != null){
            return new HouseResult<>(0,"房屋具体资料查询成功",houseInfo);
        }else
        {
            return new HouseResult<>(1,"房屋具体资料查询失败",houseInfo);
        }
    }


    /**
     * addHouse 【添加一条房屋资料信息】
     * @param request 请求。用于获取项目根路径；
     * @param myHouse 添加房屋的相关信息。
     */
    @Override
    public HouseResult<Object> addHouse(HttpServletRequest request, MyHouse myHouse) {
        //怎么收前端传来的文件
        /*
         * HttpServletRequest:封装前端请求的数据，比如URL和参数
         * HttpServletResponse：
         * */

        //MultipartHttpServletRequest封装文件上传请求
        MultipartHttpServletRequest ms=(MultipartHttpServletRequest) request;
        /*
         * 上传文件：
         *   1、把文件上传到服务器，然后把路径存到数据库
         *   2、转化为byte[]存入数据库
         * */
        //获取前端传来的文件，通过控件名获取
        CommonsMultipartFile multipartFile1= (CommonsMultipartFile) ms.getFile("file1");
        CommonsMultipartFile multipartFile2= (CommonsMultipartFile) ms.getFile("file2");
        CommonsMultipartFile multipartFile3= (CommonsMultipartFile) ms.getFile("file3");
        //获取服务器根路径
        /**E:\\IndividualOffice\\Training Center\workProject\\dxhouse\\target\\dxh\\upload*/
        String realPath=request.getSession().getServletContext().getRealPath("/upload");
        //输出服务器根目录路径
        System.out.println(realPath);
        //file1.getOriginalFilename()文件后缀
        //给图片命名
        String originalFilename1 = multipartFile1.getOriginalFilename();
        String fileName1= UUID.randomUUID().toString().replace("-","")+ originalFilename1.substring(originalFilename1.lastIndexOf("."));
        String fileName2=UUID.randomUUID().toString().replace("-","")+multipartFile2.getOriginalFilename().substring(multipartFile2.getOriginalFilename().lastIndexOf("."));
        String fileName3=UUID.randomUUID().toString().replace("-","")+multipartFile3.getOriginalFilename().substring(multipartFile3.getOriginalFilename().lastIndexOf("."));
        //file类:文件类,获取或者修改或者存入文件，可以获取文件夹和文件
        //新建文件夹，一时间命名
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String timeSts = format.format(date);
        //获取带日期的文件夹
        File realDir = new File(realPath + "/" + timeSts);
        /**判断如果路径不存在则创建文件夹*/
        if(!realDir.exists()) {
            realDir.mkdirs();
        }
        //组装路径：
        String path1=realPath+"/"+timeSts+"/"+fileName1;
        String path2=realPath+"/"+timeSts+"/"+fileName2;
        String path3=realPath+"/"+timeSts+"/"+fileName3;
        //获取路径文件夹
        File file1=new File(path1);
        File file2=new File(path2);
        File file3=new File(path3);
        /*
         * IO流：分为输入流、输入流：用来向磁盘读取或存放的
         *       字节流、字符流
         * */
        try {
            FileUtils.copyInputStreamToFile(multipartFile1.getInputStream(),file1);
            FileUtils.copyInputStreamToFile(multipartFile2.getInputStream(),file2);
            FileUtils.copyInputStreamToFile(multipartFile3.getInputStream(),file3);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //执行持久层操作：添加一条房屋资料信息
        Integer successResult = myHouseMapper.addHouse(myHouse);

        //如果执行的影响行数不为0，那么则表示添加成功；
        if(successResult != 0){
            return new HouseResult<>(0,"房屋资料信息添加成功",successResult);
        }else {
            return new HouseResult<>(1,"房屋资料信息添加失败",successResult);
        }
    }


    /**
     * uppHouseById 【根据Id修改一条房屋信息】
     * @param myHouse 房屋Id；
     * @return 将结果返回给表现层。
     */
    @Override
    public HouseResult<Object> uppHouseById(MyHouse myHouse) {
        //执行持久层操作：根据Id修改一条房屋信息
        Integer successResult = myHouseMapper.uppHouseById(myHouse);

        //如果执行的影响行数不为0，那么则表示修改成功；
        if(successResult != 0){
            return new HouseResult<>(0,"房屋资料信息修改成功",successResult);
        }else {
            return new HouseResult<>(1,"房屋资料信息修改失败",successResult);
        }
    }
}
